package vetor;

public class LinkedVector<T> implements IVector<T> {

	int size = 0;
	NoLista<T> inicio;
	
	@Override
	public boolean insertAtRank(int rank, T data) {
		if (rank <= 0) return false;
		if (this.size + 1 < rank) return false;
		NoLista<T> novoNo = new NoLista<T>(null, null, data);
		if(size == 0){
			inicio = novoNo;
		}
		else{
			
			NoLista<T> noPrev = this.nodeAtRank(rank - 1);
			NoLista<T> noAfter = this.nodeAtRank(rank);
			
			if(noPrev != null){
				novoNo.setPrev(noPrev);
				noPrev.setNext(novoNo);
			}
			if(noAfter != null){
				novoNo.setNext(noAfter);
				noAfter.setPrev(novoNo);
			}
			if(rank == 1)
				inicio = novoNo;
		}
		size++;
		return true;
	}

	@Override
	public T elemAtRank(int rank) {
		return nodeAtRank(rank).element();
	}
	
	private NoLista<T> nodeAtRank(int rank){
		if(rank <=0)
			return null;
		NoLista<T> target = inicio;
		for(int i = 2; i <= rank; i++){
			target = target.getNext();
		}
		return target;
	}
	
	void setInicio(NoLista<T> no){
		//TODO apenas para auxiliar os testes. Talvez seja removido futuramente.
		this.inicio = no;
	}
}
